//package ;
//
//import org.apache.commons.lang3.ArrayUtils;
//import org.apache.commons.lang3.StringUtils;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.hibernate.validator.HibernateValidator;
//import org.springframework.stereotype.Component;
//import org.springframework.util.CollectionUtils;
//
//import javax.validation.ConstraintViolation;
//import javax.validation.Valid;
//import javax.validation.Validation;
//import javax.validation.Validator;
//import java.lang.reflect.Method;
//import java.lang.reflect.Parameter;
//import java.util.*;
//
//@Aspect
//@Component
//public class ValidationAspect {
//
//    private static final Validator validator = Validation.byProvider(HibernateValidator.class)
//            .configure().failFast(true).buildValidatorFactory().getValidator();
//
//    @Pointcut("@annotation(javax.validation.Valid)")
//    public void pointCut() {}
//
//    @Around("pointCut()")
//    public Object around(ProceedingJoinPoint point) throws Throwable {
//        // 无参数, 则跳过校验
//        Object[] args = point.getArgs();
//        if (ArrayUtils.isEmpty(args)) {
//            return point.proceed();
//        }
//        // 获取方法入参类型
//        Method method = ((MethodSignature) point.getSignature()).getMethod();
//        Parameter[] parameters = method.getParameters();
//        // 指定校验入参
//        boolean isAssign = false;
//        for (int i = 0; i < args.length; ++i) {
//            if (null == parameters[i].getAnnotation(Valid.class)) {
//                continue;
//            }
//            isAssign = true;
//            String result = this.validate(args[i]);
//            if (StringUtils.isNotBlank(result)) {
//                throw new IllegalArgumentException(result);
//            }
//        }
//        if (isAssign) {
//            return point.proceed();
//        }
//
//        // 全部参数校验
//        for (Object arg : args) {
//            String result = this.validate(arg);
//            if (StringUtils.isNotBlank(result)) {
//                throw new IllegalArgumentException(result);
//            }
//        }
//        return point.proceed();
//    }
//
//    /**
//     * @description 参数校验
//     * <p> <功能详细描述> </p>
//     *
//     * @author 陈晨
//     * @date 2021/8/10 11:34
//     */
//    private <T> String validate(T t) {
//        if (null == t) {
//            return "request args is null";
//        }
//        // Map
//        if (t instanceof Map) {
//            Map tMap = (Map) t;
//            for (Object key : tMap.keySet()) {
//                String result = this.validate(key);
//                if (StringUtils.isNotBlank(result)) {
//                    return result;
//                }
//            }
//            for (Object value : tMap.values()) {
//                String result = this.validate(value);
//                if (StringUtils.isNotBlank(result)) {
//                    return result;
//                }
//            }
//        }
//        // Collection
//        if (t instanceof Collection) {
//            Iterator iter = ((Collection) t).iterator();
//            while (iter.hasNext()) {
//                String result = this.validate(iter.next());
//                if (StringUtils.isNotBlank(result)) {
//                    return result;
//                }
//            }
//        }
//        // 参数验证
//        Set<ConstraintViolation<T>> constraintViolations = validator.validate(t);
//        if (CollectionUtils.isEmpty(constraintViolations)) {
//            return "";
//        }
//        List<String> tipList = new ArrayList<>();
//        constraintViolations.forEach(cv -> tipList.add(cv.getMessage()));
//        return StringUtils.join(tipList, ",");
//    }
//
//}
//
//
